iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
AI/ ML & Data

使用 jq 處理資料系列 第 12

Day12: 字串變數置換 (String interpolation)

  • 分享至 

  • xImage
  •  

昨天我們認識了 jqplay 這個輕便實用的線上工具,我們接著學習更多 jq filter 的用法吧。

對話中學習

師傅:今天學習字串變數置換(String interpolation)。準備好了嗎?

徒弟:是的,師傅!我已經迫不及待要學習新的技能了。

師傅:很好。先回顧一下,如何提取JSON物件的title屬性?

徒弟:呃...我想是這樣:jq ".title" todo.json

師傅:沒錯。現在,我們來看看如何將它與其他文字組合。試試這個:jq "\"Task: \(.title)\"" todo.json

徒弟:哇!這是將"Task:"和title的值組合在一起了嗎?

師傅:正確。這就是字串變數置換。\()內可以放任何jq表達式。

徒弟:太酷了!那麼,我們可以擺放多個變數值嗎?

師傅:當然。試試這個:jq "\"Task \(.id): \(.title)\"" todo.json

徒弟:我明白了!這樣我們就可以組出更複雜的輸出格式了。

師傅:沒錯。現在,你能建立一個包含所有屬性的字串嗎?

徒弟:讓我試試...jq "\"ID: \(.id), Title: \(.title), Completed: \(.completed), User ID: \(.userId)\"" todo.json

師傅:完美。你學得很快。


字串變數置換 (String interpolation)

String interpolation 直接翻譯可以是 "字串插值" ,然而因為這個用法的意義是「在一段字串樣板之中,指定位置擺放變數,運算結果會將該變數以變數值取代輸出成文字」,其中有「可以指定位置再以值取代」的重要意思,簡單來說就是「置換」,所以我覺得翻作 「字串變數置換」比較切中題意(推眼鏡👓)。

字串變數置換的語法是 \(變數) ,例如前面對話中的 \(.title) 。如果在字串中沒有使用字串變數置換的語法,只能顯示出 .title 的結果。下面兩張圖做比較:

字串中直接放 .title 使用字串變數置換 \(.title)
https://ithelp.ithome.com.tw/upload/images/20240926/20078389HqRhxIKeM4.jpg https://ithelp.ithome.com.tw/upload/images/20240926/20078389tunamBfRbX.jpg

前面對話中的表達式是要輸出一段字串,因此先用引號括住 "Task: ..." , 這時候就看出使用命令提示字元的缺點,因為命令提示字元原本 jq filter 就是雙引號,裡面再出現雙引號,就需要跳脫字元。如下,比起原先使用單引號的 shell 環境,因為多了跳脫字元而變成較不易閱讀的樣子。

單引號 shell 雙引號 cmd
jq '"Task: \(.title)"' jq " \"Task: \(.title)\" "

這樣看起來,處理字串的時候,使用 jqplay 線上工具,能先簡化一層雙引號,有大大的幫助😅。

  • 顯示 「ID: ..., Title: ...」 的語法如下:
jq  '"ID: \(.id), Title: \(.title)"'

https://ithelp.ithome.com.tw/upload/images/20240926/20078389lF4jdt7vlB.jpg

  • 顯示 「ID: ..., Title: ..., Completed: ..., User ID: ...」 的語法如下:
jq  '"ID: \(.id), Title: \(.title), Completed: \(.completed), User ID: \(.userId)"'

https://ithelp.ithome.com.tw/upload/images/20240926/20078389lI7NrtkX1s.jpg

結論

今天我們認識了 字串變數置換 (String interpolation)的用法,想要組字串的時候,用這個方法是最直覺的。也在這個用法之中,才真正體會到 shell 可能比 命令提示字元適合使用 jq 😅,只要適當使用跳脫字元還是可以繼續使用命令提示字元的。感謝認真的自己,今天認真的學習,明天繼續囉~


上一篇
Day11: jq 線上工具 jqplay
下一篇
Day13: map() 說話了
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言